#include "Reactor.hpp"
#include "listenr.hpp"
#include "protocol.hpp"
#include"cal.hpp"
#include <iostream>
void Usage(char *name)
{
    std::cout << name << "  +port~~~" << std::endl;
}
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
    }
    std::shared_ptr<Cal>_cal=std::make_shared<Cal>();
    std::shared_ptr<Protocol> _proc = std::make_shared<Protocol>([_cal](Request req)->Response{
        return _cal->Excute(req);
    });
    // 我们套接字的连接

    // 此时我们只是进行了listen套接字的注册 至于普通socket的注册 我们在获取新连接的时候注册
    std::shared_ptr<Connection> _listenconnection = std::make_shared<listenr>(std::stoi(argv[1]));
    _listenconnection->Register([_proc](std::string &buffer) -> std::string
                                {
                                    std::string result;
                                    while (true)
                                    {
                                        // 1.进行报文报头去除
                                        std::string pacage;
                                        if (!_proc->Decode(buffer, &pacage)) // 我们反复去进行处理知道用户缓冲区中没有了数据就会解析错误从而退出
                                            break;
                                        // 2.此时一定拿到有效载荷我们要进行反序列化
                                        std::string ret_str = _proc->Excute(pacage);
                                        result += ret_str;
                                    }
                                    return result;
                                });
    std::unique_ptr<Reactor> r = std::make_unique<Reactor>();
    r->AddConnection(_listenconnection); // 将我们的连接加入我们的reactor
    r->Loop();
    return 0;
}